home *** CD-ROM | disk | FTP | other *** search
-
- /***************************************************************************
-
- XC64.C
-
- - Commiedore 64 service routines
-
- 02/05/88 created
- 03/03/88 Laser C
-
- 09/28/88 20:10
-
- ***************************************************************************/
-
- #include <stdio.h>
- #include <osbind.h>
- #include "xglobal.h"
- #include "x6502.h"
-
- extern
- rsC00(), rsC01(), rsC02(), rsC03(), rsC04(), rsC05(), rsC06(), rsC07(),
- rsC08(), rsC09(), rsC0A(), rsC0B(), rsC0C(), rsC0D(), rsC0E(), rsC0F();
-
- extern
- wsC00(), wsC01(), wsC02(), wsC03(), wsC04(), wsC05(), wsC06(), wsC07(),
- wsC08(), wsC09(), wsC0A(), wsC0B(), wsC0C(), wsC0D(), wsC0E(), wsC0F();
-
- extern rsCXX(), wsCXX();
- extern TextPlotC64(), lPlotC64TextMono();
- extern LCmpEaX(), LCmpEaY(), LCfont();
- extern Apple_Hook(), Apple_Unhook();
-
- /* array of pointersC to 256 service routines */
- void (*Cread_service[17])() =
- {
- rsC00, rsC01, rsC02, rsC03, rsC04, rsC05, rsC06, rsC07,
- rsC08, rsC09, rsC0A, rsC0B, rsC0C, rsC0D, rsC0E, rsC0F, rsCXX
- };
-
- void (*Cwrite_service[17])() =
- {
- wsC00, wsC01, wsC02, wsC03, wsC04, wsC05, wsC06, wsC07,
- wsC08, wsC09, wsC0A, wsC0B, wsC0C, wsC0D, wsC0E, wsC0F, wsCXX
- };
-
- extern int baddr1[25];
- extern int baddr2[25];
-
- setup_c64()
- {
- register unsigned ea;
- register int x,y;
- register char *qRStat = (char *)lRStat;
- register char *qWStat = (char *)lWStat;
-
- /* clear out stat arrays */
- Blitzl(lRStat - 32768L, 16384);
- Blitzl(lWStat - 32768L, 16384);
-
- /* write-protect ROM */
- Blitb(lScratch, lMemory + (unsigned)0xA000, 8192);
- Blitb(lScratch + (unsigned) 0x2000, lMemory + (unsigned)0xE000, 8192);
- Blitc(1+128, &qWStat[0xFFFFA000], 8192);
- Blitc(1+128, &qWStat[0xFFFFE000], 8192);
-
- /* text page 1 */
- for (ea=1024; ea<2048; ea++)
- {
- qWStat[ea]=2+128;
- }
-
- qRStat[0xFFFFD012] = 7; /* some register ?? */
- qWStat[0x0292] = 8+128; /* kludge for keyboard */
- {
- int iHeap = 0;
- long lToRS, lToWS;
- long lFromRS, lFromWS, lNextRS, lNextWS;
- int iService = 0;
-
- /* blit the 16 read and 16 write routines */
- do
- {
- lToRS = lEmul + iHeap + (int)iRead;
- lFromRS = (long)Cread_service[iService];
- lNextRS = (long)Cread_service[iService+1];
-
- lToWS = lEmul + iHeap + (int)iWrite;
- lFromWS = (long)Cwrite_service[iService];
- lNextWS = (long)Cwrite_service[iService+1];
-
- #ifdef NDEBUG
- printf("Blit %d bytes, opcode %2x, from %6lx to %6lx\n",
- (int)(lNextOp - lOpcode), opcode, lOpcode, lToHeap);
- #endif
- Assert(((int)(lNextRS - lFromRS)) >= 0, "RS blitting negative");
- Assert(((int)(lNextRS - lFromRS)) != 0, "RS blitting 0");
- Assert(((int)(lNextRS - lFromRS)) <= 64, "RS blitting >64");
-
- Blitb(lFromRS, lToRS, (int)(lNextRS - lFromRS));
- Blitb(lFromWS, lToWS, (int)(lNextWS - lFromWS));
-
- iHeap += 256;
- iService++;
- } while (iService != 16);
- }
- /* set initial SP = $FF */
- PutReg('SP',0xFF);
-
- /* to save time when plotting, generate Apple font and x,y info */
-
- qRStat = (char *)LCmpEaX;
- qWStat = (char *)LCmpEaY;
- for (ea=0; ea<1024; ea++)
- {
- qWStat[ea] = ea/40; /* screen row */
- qRStat[ea] = ea%40; /* screen column */
- }
-
- qRStat = (char *)lFont8;
- qWStat = (char *)LCfont;
- for (ea=0; ea<256; ea++)
- {
- x = (ea & 0x20) ? (ea & 0x7F) : ((ea&0x7F) ^ 0x40);
- for (y=0; y<2048; y+= 256)
- {
- *qWStat++ = qRStat[x+y] ^ ((ea & 0x80) ? ~0 : 0);
- }
- }
- pHookIn = Apple_Hook;
- pUnHook = Apple_Unhook;
- }
-
- /* End of init code */
-
-
- TextPlotC64(text,loc)
- register int text;
- register int loc;
- {
- register int scrx, scry;
- register char *qbFont = (char *)LCfont;
- register char *qbScr = (char *)(lScr+3840L);
- extern char Lmp8to16();
- register char *qmp816 = (char *)Lmp8to16; /* mono only */
-
- #ifdef NDEBUG
- printf("C64Plot(): loc = %d value = %d\n", loc, text);
- #endif
-
- loc &= 1023;
- scrx = *((char *)LCmpEaX + loc);
- scry = *((char *)LCmpEaY + loc);
-
- qbFont += (text<<3);
-
- if (fIsMono)
- goto lPlotC64TextMono;
-
- asm
- {
- move.w scrx,D0 ; do funny bit field gyrations
- andi.w #~1,D0
- add.w D0,D0
- add.w D0,D0
- andi.w #1,scrx
- or.w D0,scrx
- }
-
- qbScr += baddr1[scry] + scrx;
-
- asm
- {
- move.b (qbFont)+,D0
- move.b D0,(qbScr)
- move.b D0,2(qbScr)
- sf 4(qbScr)
- sf 6(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,160(qbScr)
- move.b D0,162(qbScr)
- sf 164(qbScr)
- sf 166(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,320(qbScr)
- move.b D0,322(qbScr)
- sf 324(qbScr)
- sf 326(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,480(qbScr)
- move.b D0,482(qbScr)
- sf 484(qbScr)
- sf 486(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,640(qbScr)
- move.b D0,642(qbScr)
- sf 644(qbScr)
- sf 646(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,800(qbScr)
- move.b D0,802(qbScr)
- sf 804(qbScr)
- sf 806(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,960(qbScr)
- move.b D0,962(qbScr)
- sf 964(qbScr)
- sf 966(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,1120(qbScr)
- move.b D0,1122(qbScr)
- sf 1124(qbScr)
- sf 1126(qbScr)
- }
- return;
-
- lPlotC64TextMono:
- qbScr += baddr1[scry] + scrx + scrx;
-
- asm
- {
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,(qbScr)
- move.w D0,80(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,160(qbScr)
- move.w D0,240(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,320(qbScr)
- move.w D0,400(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,480(qbScr)
- move.w D0,560(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,640(qbScr)
- move.w D0,720(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,800(qbScr)
- move.w D0,880(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,960(qbScr)
- move.w D0,1040(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,1120(qbScr)
- move.w D0,1200(qbScr)
- }
- }
-
-
- c64()
- {
- asm {
-
- LCmpEaX:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- LCmpEaY:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- LCfont:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- wsC00:
- nop ; this is just a dummy
-
- ; handler for ROM, do nothing
- wsC01:
- addq.l #2,SP
- DISPATCH
-
- ; handler for text page 1
- wsC02:
- move.w (SP)+,drDATA
- move.l drEA,arEA
- cmp.b (arEA),drDATA ; check if byte we're storing is already there
- beq.s wsC02X ; if so, no need to plot the character
-
- move.b drDATA,(arEA) ; else, store new character and plot it
- SAVEREGS
- move.w drEA,-(SP)
- move.w drDATA,-(SP)
- jsr TextPlotC64 ; call TextPlotC64(drDATA,drEA)
- addq.l #4,SP
- LOADREGS
- wsC02X:
- DISPATCH
-
- wsC03:
- addq.l #2,SP
- DISPATCH
- wsC04:
- addq.l #2,SP
- DISPATCH
- wsC05:
- addq.l #2,SP
- DISPATCH
- wsC06:
- addq.l #2,SP
- DISPATCH
- wsC07:
- addq.l #2,SP
- DISPATCH
- wsC08:
- move.l drEA,arEA
- move.w (SP)+,drDATA
- move.b drDATA,(arEA)
- movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
-
- move.w #2,-(SP)
- move.w #1,-(SP)
- trap #13 ; Bconstat(2)
- addq.l #4,SP
-
- tst.w D0 ; is there a key ready?
- beq.s wsC083 ; no
-
- wsC082:
- move.w #2,-(SP)
- move.w #2,-(SP)
- trap #13 ; Bconin(2)
- addq.l #4,SP
-
- move.w #0x277,drEA
- move.l drEA,arEA
- cmpi.b #8,drDATA ; backspace is 20, not 8
- bne.s wsC084
- moveq #20,drDATA
- wsC084:
- cmpi.b #64,drDATA
- bcs wsC085
- eori.b #32,drDATA
- wsC085:
- move.b drDATA,(arEA)
- move.w #0x00C6,drEA
- move.l drEA,arEA
- addq.b #1,(arEA)
- wsC083:
- movem.l (SP)+,D1-D7/A0-A2
- DISPATCH
-
- wsC09:
- addq.l #2,SP
- DISPATCH
- wsC0A:
- addq.l #2,SP
- DISPATCH
- wsC0B:
- addq.l #2,SP
- DISPATCH
- wsC0C:
- addq.l #2,SP
- DISPATCH
- wsC0D:
- addq.l #2,SP
- DISPATCH
- wsC0E:
- addq.l #2,SP
- DISPATCH
- wsC0F:
- addq.l #2,SP
- DISPATCH
- wsCXX:
- addq.l #2,SP
- DISPATCH
-
- rsC00:
- rts
- rsC01:
- rts
- rsC02:
- rts
- rsC03:
- rts
- rsC04:
- rts
- rsC05:
- rts
- rsC06:
- rts
-
- rsC07:
- move.l drEA,arEA
- clr.b (arEA)
- rts
-
- ; read $xxxx, the C64's keyboard flag
- rsC08:
- movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
-
- move.w #2,-(SP)
- move.w #1,-(SP)
- trap #13 ; Bconstat(2)
- addq.l #4,(SP)+
-
- tst.w D0 ; is there a key ready?
- bne.s rsC082 ; yes
- movem.l (SP)+,D1-D7/A0-A2 ; else just exit
- rts
-
- rsC082:
- move.w #2,-(SP)
- move.w #2,-(SP)
- trap #13 ; Bconin(2)
- addq.l #4,(SP)+
-
- move.l drEA,arEA
- clr.b (arEA)
- move.w #0x277,drEA
- move.l drEA,arEA
- move.b drDATA,(arEA)
- move.w #0x00C6,drEA
- move.l drEA,arEA
- addq.b #1,(arEA)
- movem.l (SP)+,D1-D7/A0-A2
- rts
-
- rsC09:
- rts
- rsC0A:
- rts
- rsC0B:
- rts
- rsC0C:
- rts
- rsC0D:
- rts
- rsC0E:
- rts
- rsC0F:
- rts
- rsCXX:
- rts
- }
- }
-
-
-